package logic

import (
	"go.uber.org/zap"
	"struggle/dao/mysql"
	"struggle/model"
)

type zanLogic struct{}

var DefaultZan = zanLogic{}

// 称赞指定的文章、提问、评论、回答
func (z zanLogic) Zan(sn, userSn uint64, objType int) (err error) {
	zan := &model.ZanMeta{
		UserSn:     userSn,
		ObjectType: objType, // 被赞对象类型,0-文章;1-问题;2-回答;3-评论
		ObjectId:   sn,
	}
	err = mysql.DefaultZan.Create(zan)
	if err != nil {
		zap.L().Error("给指定对象的称赞 failed", zap.Any("zan", zan), zap.Error(err))
		return
	}
	return
}

// 取消称赞指定的文章、提问、评论、回答
func (z zanLogic) UnZan(sn, userSn uint64, objType int) (err error) {
	zan := &model.ZanMeta{
		UserSn:     userSn,
		ObjectType: objType, // 被赞对象类型,0-文章;1-问题;2-回答;3-评论
		ObjectId:   sn,
	}
	err = mysql.DefaultZan.Delete(zan)
	if err != nil {
		zap.L().Error("给指定对象的取消称赞 failed", zap.Any("zan", zan), zap.Error(err))
		return
	}
	return
}

// 查询当前用户是否已经给该文章、问题、回答、评论点过赞
func (z zanLogic) QueryOne(sn, userSn uint64, objType int) (done bool, err error) {
	zan := &model.ZanMeta{
		UserSn:     userSn,
		ObjectType: objType, // 被赞对象类型,0-文章;1-问题;2-回答;3-评论
		ObjectId:   sn,
	}
	count, err := mysql.DefaultZan.FindBool(zan)
	if err != nil {
		zap.L().Error("查询当前用户是否已经给该文章、问题、回答、评论点过赞 failed", zap.Any("zan", zan), zap.Error(err))
		return
	}
	if count > 0 {
		return true, nil
	}
	return false, nil
}
